Redshiftのスケジュールクエリの実態はEventBridgeルールである
こんにちは、八木です。
Redshfitクエリエディタ(v1)にはクエリをスケジュールする機能があります。
この機能では、実行頻度と実行クエリを設定することで、定期的に設定したクエリを実行することが可能です。
集計結果の更新など、定期的にクエリを実行するユースケースでは、こちらの機能を検討される方も多いのではないでしょうか?
実はこの機能はAWSの他サービスを自動作成する機能となっており、Redshiftクエリエディタ特有の機能ではありません。実態は他のAWSサービスです。
今回はスケジュールクエリの設定により、何のサービスが作成されるか、つまり何のサービスによって、スケジュール機能は実行されているかを解説します。
完全な出落ち
フリも虚しく、タイトルで盛大なネタバレをしています。そう、スケジュールクエリの実態はEventBridgeルールです。
スケジュールクエリを作成すると、Redshiftをターゲットに持つEventBridgeルールが作成されます。このEventBridgeルールには、「イベントによるトリガー」と「スケジュールによるトリガー」がありますが、スケジュールクエリによって作成されるEventBridgeルールは後者の「スケジュールによるトリガー」です。
作成されたEventBridgeルールでは、指定時間にトリガーされ、Redshift Data APIを通じてRedshiftでクエリを実行します。
スケジュールクエリを作成して確認してみる
ではクエリスケジュールを作成し、どんなEventBridgeルールが作成されるのか確認してみます。
まずクエリエディタを開き、「Schedule」からクエリをスケジュールします。
スケジュールに必要なIAMロール、クエリを実行するユーザ情報が保存されたSecrets Managerのシークレットを選択します。
クエリ名は「redshift-cluster-2-schedule-query-1」としました。
今回は1時間に1回の頻度でクエリを実行するよう設定します。
オプションとして、モニタリングも有効にしてみました。
以上の設定で作成を完了しました。「スケジュールされたクエリ」のタブを見ると、作成したスケジュールが追加されていることがわかります。
それでは、EventBridgeが作成されたかを確認してみます。
まずCloudTrailのログを確認すると、「EventBridgeルール」と「ルールによって呼び出されるターゲット」が登録されたことがわかります。
EventBridgeルールを確認してみると、クエリ名と同じ名前のルールが作成されていました。
イベント詳細画面からイベントスケジュールを確認すると、クエリエディタで指定した頻度になっています。
また、ターゲットには指定したRedshfitクラスターとSNSトピックが設定されていました。クエリ内容も「スケジュールされたクエリ」で指定したものになっています。
スケジュールクエリは、RedshiftをターゲットとするEventBridgeルールであることが確認できました。
EventBridgeルールはスケジュールクエリとして表示されるのか?
クエリエディタから登録したスケジュールクエリは、クエリエディタでも、EventBridgeでも確認ができました。では反対に、EventBridgeで登録したクエリはクエリエディタでも確認できるのか?という疑問が上がってきます。
ということで試してみました!
まずEventBridgeルールを作成します。
作成するルールの名前は「scheduled-query-from-eventbridge」にしました。
現在は、スケジュール実行のルールの代わりにEventBridgeスケジューラを推奨されますが、「続行してルールを作成する」からEventBridgeルールを作成します。
ターゲットに「Redshfitクラスター」を選択し、対象のクラスター名や実行するSQLなどを入力します。
他のターゲットは指定せず、ルールを作成しました。
クエリエディタに戻り、「スケジュールされたクエリ」タブを確認してみます。
「created_rule_in_scheduled_query」が表示されていました。
これでクエリエディタから作成したスケジュールクエリでなくとも、EventBridgeルールはスケジュールクエリとして表示されることがわかりました。
余談
クエリエディタv2はスケジュールクエリ機能がない
このスケジュールクエリですが、クエリエディタv2では設定することができません。
「スケジュールクエリを使いたい!!けどクエリエディタはv2がいいんだ!!!」
そんな皆さん、もう対処法はわかりますね?
EventBridgeルールを作成すれば良いのです。だってクエリスケジュールの実態はEventBridgeルールなのだから。
ただし、ここで待ったをかけさせてください。定期実行にはEventBridgeルールもいいのですが、EventBridgeスケジューラという選択肢もあります。
EventBridgeスケジューラは2022/11にリリースされた機能で、EventBridgeルールのスケジュール実行よりも機能が豊富であり、多様なターゲットを利用できます。EvenBridgeルールのスケジュール実行とEventBridgeスケジューラでは機能の差異はあるものの、今後はEventBridgeスケジューラの方がメインで利用されると思われます。
先のスクショにもあるように、スケジュール実行のEventBridgeルールを作成しようとすると、EventBridgeスケジューラをおすすめされます。
クエリエディタv2を使う場合や、クエリエディタ(v1)でスケジュールされたクエリを確認する必要がないのであれば、EventBridgeスケジューラを使うと良いしょう。
Redshift Serverlessに対してスケジュールクエリを作成したい
ご存知の方も多いかもしれませんが、クエリエディタはプロビジョンドRedshiftにしか対応していません。
ここまでの記事を読んだみなさんなら、思いつくはずです。
「じゃあ、EventBridgeルール作れば良いだけだ!!!」
良い推論ですが、残念ながらできません。
EventBridgeルールのターゲットにRedshift Serverlessは存在しないのです。
なので諦めるしかない。。。。訳ではありません!!!
ここで再び登場、EventBridgeスケジューラです。
なんと、EventBridgeスケジューラはRedshift Serverlessをターゲットすることが可能です。
EventBridgeスケジューラはEventBridgeルールに比べて遥かに多いターゲットに対応しており、その中の1つにRedshift Data APIが含まれます。
Redshift Data APIはパラメータを変えることによって、プロビジョンドRedshiftにもRedshift Serverlessにもクエリを実行することが可能なのです。
こうして、EventBridgeスケジューラのターゲットにRedshift Data APIを設定し、パラメータでRedshift Serverlessを指定することにより、クエリ定期実行が可能になります。
ということで、また1つEventBridgeスケジューラをおすすめする理由が増えました。
追って「EventBridgeスケジューラによるRedshift Serverlessへのクエリ定期実行」も記事にします。乞うご期待。
記事を公開しました。合わせてご覧ください。
最後に
今回の記事は、「クエリエディタ(v1)で作成したスケジュールクエリは実はEventBridgeルールなんだよ」という話でした。
中身を知ったことで、EventBridgeルールではなく、EventBridgeスケジューラを使うなどのカスタマイズも可能であることがわかったかと思います。
必要に応じて、カスタマイズしていきましょう。
以上、八木でした!
参考資料
クエリエディタを使用してデータベースのクエリを実行する - Amazon Redshift
クエリのスケジュール設定 - Amazon Redshift
Amazon EventBridge ターゲット - Amazon EventBridge